home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 23 Character Animation / SkinnedMesh / FrameResource.h < prev    next >
C/C++ Source or Header  |  2016-03-02  |  4KB  |  128 lines

  1. #pragma once
  2.  
  3. #include "../../Common/d3dUtil.h"
  4. #include "../../Common/MathHelper.h"
  5. #include "../../Common/UploadBuffer.h"
  6.  
  7. struct ObjectConstants
  8. {
  9.     DirectX::XMFLOAT4X4 World = MathHelper::Identity4x4();
  10.     DirectX::XMFLOAT4X4 TexTransform = MathHelper::Identity4x4();
  11.     UINT     MaterialIndex;
  12.     UINT     ObjPad0;
  13.     UINT     ObjPad1;
  14.     UINT     ObjPad2;
  15. };
  16.  
  17. struct SkinnedConstants
  18. {
  19.     DirectX::XMFLOAT4X4 BoneTransforms[96];
  20. };
  21.  
  22. struct PassConstants
  23. {
  24.     DirectX::XMFLOAT4X4 View = MathHelper::Identity4x4();
  25.     DirectX::XMFLOAT4X4 InvView = MathHelper::Identity4x4();
  26.     DirectX::XMFLOAT4X4 Proj = MathHelper::Identity4x4();
  27.     DirectX::XMFLOAT4X4 InvProj = MathHelper::Identity4x4();
  28.     DirectX::XMFLOAT4X4 ViewProj = MathHelper::Identity4x4();
  29.     DirectX::XMFLOAT4X4 InvViewProj = MathHelper::Identity4x4();
  30.     DirectX::XMFLOAT4X4 ViewProjTex = MathHelper::Identity4x4();
  31.     DirectX::XMFLOAT4X4 ShadowTransform = MathHelper::Identity4x4();
  32.     DirectX::XMFLOAT3 EyePosW = { 0.0f, 0.0f, 0.0f };
  33.     float cbPerObjectPad1 = 0.0f;
  34.     DirectX::XMFLOAT2 RenderTargetSize = { 0.0f, 0.0f };
  35.     DirectX::XMFLOAT2 InvRenderTargetSize = { 0.0f, 0.0f };
  36.     float NearZ = 0.0f;
  37.     float FarZ = 0.0f;
  38.     float TotalTime = 0.0f;
  39.     float DeltaTime = 0.0f;
  40.  
  41.     DirectX::XMFLOAT4 AmbientLight = { 0.0f, 0.0f, 0.0f, 1.0f };
  42.  
  43.     // Indices [0, NUM_DIR_LIGHTS) are directional lights;
  44.     // indices [NUM_DIR_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHTS) are point lights;
  45.     // indices [NUM_DIR_LIGHTS+NUM_POINT_LIGHTS, NUM_DIR_LIGHTS+NUM_POINT_LIGHT+NUM_SPOT_LIGHTS)
  46.     // are spot lights for a maximum of MaxLights per object.
  47.     Light Lights[MaxLights];
  48. };
  49.  
  50. struct SsaoConstants
  51. {
  52.     DirectX::XMFLOAT4X4 Proj;
  53.     DirectX::XMFLOAT4X4 InvProj;
  54.     DirectX::XMFLOAT4X4 ProjTex;
  55.     DirectX::XMFLOAT4   OffsetVectors[14];
  56.  
  57.     // For SsaoBlur.hlsl
  58.     DirectX::XMFLOAT4 BlurWeights[3];
  59.  
  60.     DirectX::XMFLOAT2 InvRenderTargetSize = { 0.0f, 0.0f };
  61.  
  62.     // Coordinates given in view space.
  63.     float OcclusionRadius  = 0.5f;
  64.     float OcclusionFadeStart = 0.2f;
  65.     float OcclusionFadeEnd = 2.0f;
  66.     float SurfaceEpsilon = 0.05f;
  67. };
  68.  
  69. struct MaterialData
  70. {
  71.     DirectX::XMFLOAT4 DiffuseAlbedo = { 1.0f, 1.0f, 1.0f, 1.0f };
  72.     DirectX::XMFLOAT3 FresnelR0 = { 0.01f, 0.01f, 0.01f };
  73.     float Roughness = 0.5f;
  74.  
  75.     // Used in texture mapping.
  76.     DirectX::XMFLOAT4X4 MatTransform = MathHelper::Identity4x4();
  77.  
  78.     UINT DiffuseMapIndex = 0;
  79.     UINT NormalMapIndex = 0;
  80.     UINT MaterialPad1;
  81.     UINT MaterialPad2;
  82. };
  83.  
  84. struct Vertex
  85. {
  86.     DirectX::XMFLOAT3 Pos;
  87.     DirectX::XMFLOAT3 Normal;
  88.     DirectX::XMFLOAT2 TexC;
  89.     DirectX::XMFLOAT3 TangentU;
  90. };
  91.  
  92. struct SkinnedVertex
  93. {
  94.     DirectX::XMFLOAT3 Pos;
  95.     DirectX::XMFLOAT3 Normal;
  96.     DirectX::XMFLOAT2 TexC;
  97.     DirectX::XMFLOAT3 TangentU;
  98.     DirectX::XMFLOAT3 BoneWeights;
  99.     BYTE BoneIndices[4];
  100. };
  101.  
  102. // Stores the resources needed for the CPU to build the command lists
  103. // for a frame.  
  104. struct FrameResource
  105. {
  106. public:
  107.     
  108.     FrameResource(ID3D12Device* device, UINT passCount, UINT objectCount, UINT skinnedObjectCount, UINT materialCount);
  109.     FrameResource(const FrameResource& rhs) = delete;
  110.     FrameResource& operator=(const FrameResource& rhs) = delete;
  111.     ~FrameResource();
  112.  
  113.     // We cannot reset the allocator until the GPU is done processing the commands.
  114.     // So each frame needs their own allocator.
  115.     Microsoft::WRL::ComPtr<ID3D12CommandAllocator> CmdListAlloc;
  116.  
  117.     // We cannot update a cbuffer until the GPU is done processing the commands
  118.     // that reference it.  So each frame needs their own cbuffers.
  119.     std::unique_ptr<UploadBuffer<PassConstants>> PassCB = nullptr;
  120.     std::unique_ptr<UploadBuffer<ObjectConstants>> ObjectCB = nullptr;
  121.     std::unique_ptr<UploadBuffer<SkinnedConstants>> SkinnedCB = nullptr;
  122.     std::unique_ptr<UploadBuffer<SsaoConstants>> SsaoCB = nullptr;
  123.     std::unique_ptr<UploadBuffer<MaterialData>> MaterialBuffer = nullptr;
  124.  
  125.     // Fence value to mark commands up to this fence point.  This lets us
  126.     // check if these frame resources are still in use by the GPU.
  127.     UINT64 Fence = 0;
  128. };